package fangseo2;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;

public class Test {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
  /*
        Class类中用于获取构造方法的方法
            Constructor<?>[] getConstructors()                                返回所有公共构造方法对象的数组
            Constructor<?>[] getDeclaredConstructors()                        返回所有构造方法对象的数组
            Constructor<T> getConstructor(Class<?>... parameterTypes)         返回单个公共构造方法对象
            Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回单个构造方法对象

getDeclaredConstructors 公共和私有都可以获取
        Constructor类中用于创建对象的方法
            T newInstance(Object... initargs)                                 根据指定的构造方法创建对象
            setAccessible(boolean flag)                                       设置为true,表示取消访问检查
    */

        //1.先获取字节码class文件对象
        Class clazz = Class.forName("fangseo2.Student");
        //2.通过class文件对象获取构造方法对象
      /*  Constructor[] cons1 = clazz.getConstructors();//返回所有公共构造方法对象的数组
        for (Constructor con : cons1) {
            System.out.println(con);
        }*/

       /* Constructor[] cons2 = clazz.getDeclaredConstructors();  //返回所有构造方法对象的数组
        for (Constructor con : cons2) {
            System.out.println(con);
        }*/

        /*//返回单个公共构造方法对象   Constructor<T> getConstructor(Class<?>... parameterTypes)
        Constructor cons3 = clazz.getConstructor();
        System.out.println(cons3);
        Constructor cons4 = clazz.getConstructor(String.class);
        System.out.println(cons4);*/


        //Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回单个构造方法对象
        Constructor cons5 = clazz.getDeclaredConstructor(String.class, int.class);
        System.out.println(cons5);

    /*    int modifiers = cons5.getModifiers();
        System.out.println(modifiers);*/

        System.out.println("=======================");
        int parameterCount = cons5.getParameterCount();
        System.out.println(parameterCount);
        System.out.println("=======================");
        Parameter[] parameters = cons5.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }
        System.out.println("=======================");

        //暴力反射：表示临时取消权限校验
        cons5.setAccessible(true);
        Student stu = (Student) cons5.newInstance("张三", 23);

        System.out.println(stu);

    }
}
